import { EventTarget, sys } from 'cc';

/**
 * 全局事件枚举
 */
export enum GlobalEvent {
    USER_LOGIN = 'USER_LOGIN',
    USER_LOGOUT = 'USER_LOGOUT',
    DATA_UPDATED = 'DATA_UPDATED',
    // ...可扩展
};



export type SceneConfig = {
    type: 'local' | 'bundle';
    name: string;
    bundle?: string;
    isRemote?: boolean; // 是否远程分包
    needPreload?: boolean;
    forceLocalInH5?: boolean; // H5环境下强制使用本地资源
};

export type PopupConfig = {
    path: string;
    bundle?: string;
    data?: any;
    isRemote?: boolean; // 是否远程分包弹窗
};

/**
 * 全局配置管理类
 */
export class GlobalManager {
    public static serverUrl: string = "https://oss.fiveteam.top/kgdmc/";
    public static audioUrl: string = "https://oss.lekgm.top/jiuguan/sound/";
    public static httpUrl: string = "https://api.lekonghd.cn/";

    public static gameVersion: string = "v1.0.0";
    public static gameName:string = "3dGame";
    /**是否启动短连接tokeny */
    public static shortToken:string = null;

    
    /**
     * 平台配置
     */
    public static readonly isH5 = sys.isBrowser
    
    /**
     * H5环境下是否禁用远程bundle加载
     */
    public static disableRemoteBundleInH5: boolean = true;
    
    /**
     * H5环境下是否禁用远程JSON加载
     * JSON配置建议保持远程加载，以便热更新游戏配置
     */
    public static disableRemoteJsonInH5: boolean = false;
    
    /**
     * 需要预加载的 JSON 数据配置
     * 每项包含 path（资源路径）、configKey（存入 ConfigManager 的 key）、isRemote（是否优先远程加载）
     * JSON配置建议优先使用远程加载，以便热更新游戏配置
     */
    public static preloadJsonList: { path: string; configKey: string; isRemote?: boolean }[] = [
        { path: 'config/system', configKey: 'system', isRemote: false },

    ];

    /**
     * 场景配置
     * isRemote: 是否远程分包
     * forceLocalInH5: H5环境下强制使用本地资源
     * needPreload:是否支持启动预加载
     */
    public static scenes: SceneConfig[] = [
        {type: 'local', bundle: 'Main',name: 'Main',isRemote: false,needPreload:true },
    ];

    /**
     * 弹窗配置
     * isRemote: 是否远程分包弹窗
     * forceLocalInH5: H5环境下强制使用本地资源
     */
    public static popups: Record<string, PopupConfig> = {
        ConfirmDialog: { bundle: 'popups', path: 'ConfirmDialog', data: {}, isRemote: false },
        /**设置模块 */
        settingPop: { bundle: null, path: 'prefab/settingPop', data: {}, isRemote: false },
        /**排行榜模块 */
        rankPop: { bundle: null, path: 'prefab/rankPop', data: {}, isRemote: false },
        /**测试模块 */
        testPop: { bundle: "testDemo", path: 'testPop', data: {}, isRemote: false },
        
    };

    // 不需要清理的bundle集合
    public static noCleanupBundles: Set<string> = new Set();

    /**
     * 注册不需要清理的bundle
     */
    public static addNoCleanupBundle(bundleName: string) {
        this.noCleanupBundles.add(bundleName);
    }

    /**
     * 取消注册不需要清理的bundle
     */
    public static removeNoCleanupBundle(bundleName: string) {
        this.noCleanupBundles.delete(bundleName);
    }

    /**
     * 获取远程bundle的完整URL
     * 远程bundle需要加版本号目录：serverUrl + gameVersion + bundleName
     */
    public static getRemoteBundleUrl(bundleName: string): string {
        return `${this.serverUrl}${this.gameVersion}/${bundleName}`;
    }

    /**
     * 获取远程JSON的完整URL
     * 远程JSON不需要加版本号目录：serverUrl + jsonPath
     */
    public static getRemoteJsonUrl(jsonPath: string): string {
        return `${this.serverUrl}${jsonPath}.json`;
    }

    /**
     * 获取远程资源的缓存key
     * 用于区分不同类型的远程资源
     */
    public static getRemoteCacheKey(resourceName: string, isBundle: boolean = true): string {
        if (isBundle) {
            // bundle需要包含版本号
            return `${this.serverUrl}${this.gameVersion}/${resourceName}`;
        } else {
            // JSON不需要版本号
            return `${this.serverUrl}${resourceName}`;
        }
    }

    /**
     * 检查是否应该使用远程加载
     * @param isRemote 配置中的远程标志
     * @param isBundle 是否是bundle资源
     */
    public static shouldUseRemote(isRemote: boolean, isBundle: boolean = true): boolean {
        if(this.isH5){
            return false
        }
        if (!isRemote) return false;
        
        // H5环境下的特殊处理
        if (this.isH5) {
            if (isBundle && this.disableRemoteBundleInH5) {
                console.log('[GlobalManager] H5环境下禁用远程bundle加载');
                return false;
            }
            if (!isBundle && this.disableRemoteJsonInH5) {
                console.log('[GlobalManager] H5环境下禁用远程JSON加载');
                return false;
            }
           
        }
        
        return true;
    }

    /**
     * 获取当前平台信息
     */
    public static getPlatformInfo(): { platform: string; isH5: boolean; shouldDisableRemote: boolean } {
        return {
            platform: sys.platform.toString(),
            isH5: this.isH5,
            shouldDisableRemote: this.isH5 && this.disableRemoteBundleInH5
        };
    }

    // 其他全局配置...
} 